/*
 * DesktopTestView.java
 */
package ar.com.jpack.desktop;

import ar.com.jpack.helpers.CustomInternalFrame;
import ar.com.jpack.transferencia.DetalleProduccionT;
import ar.com.jpack.transferencia.MailsT;
import ar.com.jpack.transferencia.MaquinasT;
import ar.com.jpack.transferencia.RolesT;
import ar.com.jpack.transferencia.StockT;
import ar.com.jpack.transferencia.UsuariosT;
import java.awt.Component;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JDesktopPane;
import javax.swing.UnsupportedLookAndFeelException;
import org.jdesktop.application.Action;
import org.jdesktop.application.ResourceMap;
import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.application.FrameView;
import org.jdesktop.application.TaskMonitor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.Constructor;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import javax.swing.ActionMap;
import javax.swing.Timer;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JSeparator;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.view.JasperViewer;
import org.jdesktop.application.Application;
import org.jdesktop.application.Task;

/**
 * The application's main frame.
 * @author jmhanun
 */
public class DesktopView extends FrameView {

    private void alerta(String strButtonName) {
        for (int i = 0; i < jToolBar.getComponents().length; i++) {
            Component component = jToolBar.getComponents()[i];
            if (component.getName().equals(strButtonName)) {

                JOptionPane.showInternalMessageDialog(desktopPanel,
                        ((JButton) component).getClientProperty("cuerpo"),
                        ((JButton) component).getClientProperty("titulo").toString(),
                        JOptionPane.WARNING_MESSAGE);

                jToolBar.remove(component);
                jToolBar.repaint();
            }
        }
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        mainPanel = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        desktopPanel = new javax.swing.JDesktopPane();
        jToolBar = new javax.swing.JToolBar();
        menuBar = new javax.swing.JMenuBar();
        javax.swing.JMenu fileMenu = new javax.swing.JMenu();
        javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem();
        javax.swing.JMenu helpMenu = new javax.swing.JMenu();
        javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem();
        statusPanel = new javax.swing.JPanel();
        javax.swing.JSeparator statusPanelSeparator = new javax.swing.JSeparator();
        statusMessageLabel = new javax.swing.JLabel();
        statusAnimationLabel = new javax.swing.JLabel();
        progressBar = new javax.swing.JProgressBar();

        mainPanel.setName("mainPanel"); // NOI18N
        mainPanel.setLayout(new java.awt.BorderLayout());

        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(ar.com.jpack.desktop.DesktopApp.class).getContext().getResourceMap(DesktopView.class);
        jLabel1.setIcon(resourceMap.getIcon("jLabel1.icon")); // NOI18N
        jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N
        jLabel1.setVerticalAlignment(javax.swing.SwingConstants.BOTTOM);
        jLabel1.setAlignmentY(0.0F);
        jLabel1.setName("jLabel1"); // NOI18N
        mainPanel.add(jLabel1, java.awt.BorderLayout.LINE_END);

        desktopPanel.setAutoscrolls(true);
        desktopPanel.setName("desktopPanel"); // NOI18N
        mainPanel.add(desktopPanel, java.awt.BorderLayout.CENTER);

        jToolBar.setFloatable(false);
        jToolBar.setRollover(true);
        jToolBar.setName("jToolBar"); // NOI18N
        mainPanel.add(jToolBar, java.awt.BorderLayout.SOUTH);

        menuBar.setName("menuBar"); // NOI18N

        fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N
        fileMenu.setName("fileMenu"); // NOI18N

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(ar.com.jpack.desktop.DesktopApp.class).getContext().getActionMap(DesktopView.class, this);
        exitMenuItem.setAction(actionMap.get("quit")); // NOI18N
        exitMenuItem.setName("exitMenuItem"); // NOI18N
        fileMenu.add(exitMenuItem);

        menuBar.add(fileMenu);

        helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N
        helpMenu.setName("helpMenu"); // NOI18N

        aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N
        aboutMenuItem.setName("aboutMenuItem"); // NOI18N
        helpMenu.add(aboutMenuItem);

        menuBar.add(helpMenu);

        statusPanel.setName("statusPanel"); // NOI18N

        statusPanelSeparator.setName("statusPanelSeparator"); // NOI18N

        statusMessageLabel.setName("statusMessageLabel"); // NOI18N

        statusAnimationLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        statusAnimationLabel.setName("statusAnimationLabel"); // NOI18N

        progressBar.setName("progressBar"); // NOI18N

        javax.swing.GroupLayout statusPanelLayout = new javax.swing.GroupLayout(statusPanel);
        statusPanel.setLayout(statusPanelLayout);
        statusPanelLayout.setHorizontalGroup(
            statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(statusPanelSeparator, javax.swing.GroupLayout.DEFAULT_SIZE, 445, Short.MAX_VALUE)
            .addGroup(statusPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(statusMessageLabel)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 275, Short.MAX_VALUE)
                .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(statusAnimationLabel)
                .addContainerGap())
        );
        statusPanelLayout.setVerticalGroup(
            statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(statusPanelLayout.createSequentialGroup()
                .addComponent(statusPanelSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(statusMessageLabel)
                    .addComponent(statusAnimationLabel)
                    .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(3, 3, 3))
        );

        setComponent(mainPanel);
        setMenuBar(menuBar);
        setStatusBar(statusPanel);
    }// </editor-fold>//GEN-END:initComponents
//<editor-fold defaultstate="coolapsed" desc="Declaracion de variables">
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JDesktopPane desktopPanel;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JToolBar jToolBar;
    private javax.swing.JPanel mainPanel;
    private javax.swing.JMenuBar menuBar;
    private javax.swing.JProgressBar progressBar;
    private javax.swing.JLabel statusAnimationLabel;
    private javax.swing.JLabel statusMessageLabel;
    private javax.swing.JPanel statusPanel;
    // End of variables declaration//GEN-END:variables
    private final Timer messageTimer;
    private final Timer busyIconTimer;
    private final Icon idleIcon;
    private final Icon[] busyIcons = new Icon[15];
    private int busyIconIndex = 0;
    private JDialog aboutBox;
    ArrayList<RolesT> rolesTs;
    private CustomInternalFrame padre = null;
    private Timer timer1;
    private Timer timer2;
    private Timer timer3;
    private Timer timer4;

    public JDesktopPane getDesktopPanel() {
        return desktopPanel;
    }
//</editor-fold>
    /**
     * Instancia el DesktopView indicandole el DesktopApp de quien depende.
     * @param app - DesktopApp del cual depende el DesktopView
     */
    public DesktopView(SingleFrameApplication app) {
        super(app);
        initComponents();
        // status bar initialization - message timeout, idle icon and busy animation, etc
        ResourceMap resourceMap = getResourceMap();
        getFrame().setIconImage(resourceMap.getImageIcon("icono").getImage());
        int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout");
        messageTimer = new Timer(messageTimeout, new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                statusMessageLabel.setText("");
            }
        });
        messageTimer.setRepeats(false);
        int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate");
        for (int i = 0; i < busyIcons.length; i++) {
            busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]");
        }
        busyIconTimer = new Timer(busyAnimationRate, new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                busyIconIndex = (busyIconIndex + 1) % busyIcons.length;
                statusAnimationLabel.setIcon(busyIcons[busyIconIndex]);
            }
        });
        idleIcon = resourceMap.getIcon("StatusBar.idleIcon");
        statusAnimationLabel.setIcon(idleIcon);
        progressBar.setVisible(false);
        // connecting action tasks to status bar via TaskMonitor
        TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext());
        taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() {

            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                String propertyName = evt.getPropertyName();
                if ("started".equals(propertyName)) {
                    if (!busyIconTimer.isRunning()) {
                        statusAnimationLabel.setIcon(busyIcons[0]);
                        busyIconIndex = 0;
                        busyIconTimer.start();
                    }
                    progressBar.setVisible(true);
                    progressBar.setIndeterminate(true);
                } else if ("done".equals(propertyName)) {
                    busyIconTimer.stop();
                    statusAnimationLabel.setIcon(idleIcon);
                    progressBar.setVisible(false);
                    progressBar.setValue(0);
                } else if ("message".equals(propertyName)) {
                    String text = (String) (evt.getNewValue());
                    statusMessageLabel.setText((text == null) ? "" : text);
                    messageTimer.restart();
                } else if ("progress".equals(propertyName)) {
                    int value = (Integer) (evt.getNewValue());
                    progressBar.setVisible(true);
                    progressBar.setIndeterminate(false);
                    progressBar.setValue(value);
                }
            }
        });
    }

    public void setStatusMessage(String result) {
        statusMessageLabel.setText(result);
        messageTimer.restart();
    }

    /**
     * Funcion que se ejecuta automaticamente al finalizar el login exitoso.
     * Es llamada desde DesktopLoginBox si el login fue exito.
     * Primero carga el JMenu Archivo comun a todos los usuarios.
     * Despues carga los JMenu de acuerdo a los roles asignados al usuario logueado.
     * Finalmente carga los JMenu Ventanas y Ayuda comunes a todos los usuarios.
     */
    public void cargaInicial() {

        JMenu fileMenu = new JMenu();
        JMenuItem loginMenuItem = new JMenuItem();
        JMenuItem exitMenuItem = new JMenuItem();
        JMenu ventanaMenu = new JMenu();
        JMenuItem lookMenuItem = new JMenuItem();
        JMenuItem closeAllMenuItem = new JMenuItem();
        JMenu helpMenu = new JMenu();
        JMenuItem aboutMenuItem = new JMenuItem();
        UsuariosT usuariosT = DesktopApp.getApplication().getUsuarioLogueado();
        ResourceMap resourceMap = Application.getInstance(DesktopApp.class).getContext().getResourceMap(DesktopView.class);
        ActionMap actionMap = Application.getInstance(DesktopApp.class).getContext().getActionMap(DesktopView.class, this);

        menuBar.removeAll();
        jToolBar.removeAll();
        jToolBar.repaint();
        if (timer1 != null) {
            timer1.stop();
        }
        if (timer2 != null) {
            timer2.stop();
        }
        if (timer3 != null) {
            timer3.stop();
        }
        if (timer4 != null) {
            timer4.stop();
        }
        fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N
        fileMenu.setName("fileMenu"); // NOI18N

        loginMenuItem.setAction(actionMap.get("showLoginBox")); // NOI18N
        loginMenuItem.setName("loginMenuItem"); // NOI18N
        fileMenu.add(loginMenuItem);

        exitMenuItem.setAction(actionMap.get("quit")); // NOI18N
        exitMenuItem.setName("exitMenuItem"); // NOI18N
        fileMenu.add(exitMenuItem);

        menuBar.add(fileMenu);

        if (usuariosT != null) {
            rolesTs = (ArrayList<RolesT>) usuariosT.getIdRolCollection();
            if (rolesTs != null) {
                //ordena la lista rolesTs
                Collections.sort(rolesTs);
                for (Iterator<RolesT> it = rolesTs.iterator(); it.hasNext();) {
                    RolesT rolesT = it.next();
                    if (rolesT.getIdRolPadre() == null) {
                        JMenu m = new JMenu();
//                        m.setText(resourceMap.getString(rolesT.getComponente() + ".text")); // NOI18N
                        m.setText(rolesT.getRol()); // NOI18N
                        m.setToolTipText(rolesT.getDescripcion());
                        m.setName(rolesT.getComponente()); // NOI18N
                        m = cargarMenu(m, rolesT, resourceMap, actionMap);
                        menuBar.add(m);
                    }
                }
            }
        }

        ventanaMenu.setText(resourceMap.getString("ventanaMenu.text")); // NOI18N
        ventanaMenu.setName("ventanaMenu"); // NOI18N

        lookMenuItem.setAction(actionMap.get("changeLookFeel")); // NOI18N
        lookMenuItem.setName("lookMenuItem"); // NOI18N
        ventanaMenu.add(lookMenuItem);

        ventanaMenu.add(new JSeparator());

        closeAllMenuItem.setAction(actionMap.get("closeAllFrames")); // NOI18N
        closeAllMenuItem.setName("closeAllMenuItem"); // NOI18N
        ventanaMenu.add(closeAllMenuItem);

        menuBar.add(ventanaMenu);

        helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N
        helpMenu.setName("helpMenu"); // NOI18N

        aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N
        aboutMenuItem.setName("aboutMenuItem"); // NOI18N
        helpMenu.add(aboutMenuItem);

        menuBar.add(helpMenu);

        setMenuBar(menuBar);

        if (usuariosT.getUsuario() != null) {
            this.getFrame().setTitle("MRP para Envases Pueyrredon SRL - " + usuariosT.getUsuario());
        } else {
            this.getFrame().setTitle("MRP para Envases Pueyrredon SRL");
        }

        if (usuariosT.getUsuario() != null) {
            HashMap parametros = null;
            int delay = 0;
            ArrayList<MailsT> mails = null;
            parametros = new HashMap();
            parametros.put("pGrupoMail", "ALERTA STOCK MINIMO");
            parametros.put("pIdUsuario", DesktopApp.getApplication().getUsuarioLogueado().getIdUsuario());
            parametros.put("pJoinGruposMails", true);
            parametros.put("pJoinUsuarios", true);
            parametros.put("pDescripcion", "TIMER ALERTA STOCK MINIMO");
            mails = (ArrayList<MailsT>) DesktopApp.getApplication().getMailsT(parametros);
            if (!mails.isEmpty()) {
                Float x = Float.parseFloat(DesktopApp.getApplication().getSetupT(parametros).get(0).getValor()) * 60000;
                delay = x.intValue();
                timer1 = new Timer(delay, new ActionListener() {

                    public void actionPerformed(ActionEvent e) {

                        ActionMap actionMap = Application.getInstance(DesktopApp.class).getContext().getActionMap(DesktopView.class, DesktopApp.getApplication().getDesktopView());
                        ResourceMap resourceMap = Application.getInstance(DesktopApp.class).getContext().getResourceMap(DesktopView.class);
                        DateFormat fechaFormatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
                        HashMap parametros = new HashMap();
                        parametros.put("pJoinArticulos", true);
                        StringBuffer articulos = new StringBuffer();
                        ArrayList<StockT> stockMinimoList = new ArrayList<StockT>();
                        ArrayList<StockT> stockList = (ArrayList<StockT>) DesktopApp.getApplication().getStockT(parametros);
                        for (StockT stockT : stockList) {
                            if (stockT.getCantidad() <= stockT.getIdArticulo().getStockMinimo()) {
                                stockMinimoList.add(stockT);
                                articulos.append("\n" + stockT.getIdArticulo().getCodigo());
                            }
                        }
                        if (!stockMinimoList.isEmpty()) {
                            Boolean incluido = false;
                            for (int i = 0; i < jToolBar.getComponents().length; i++) {
                                Component component = jToolBar.getComponents()[i];
                                if (component.getName().equals("ALERTASTOCKMINIMO")) {
                                    incluido = true;
                                }
                            }
                            if (!incluido) {
                                JButton btnAlarma = new JButton();
                                btnAlarma.setAction(actionMap.get("alertaStockMinimo"));
                                btnAlarma.setIcon(resourceMap.getIcon("jButtonToolBar.icon")); // NOI18N
                                btnAlarma.setText("");
                                btnAlarma.putClientProperty("titulo", "Alerta Stock Minimo");
                                btnAlarma.putClientProperty("cuerpo", "[" +
                                        fechaFormatter.format(new Date()) + "]" +
                                        "\nSe detectaron los siguientes articulos con stock por debajo del minimo:" +
                                        articulos);
                                btnAlarma.setToolTipText("ALERTA STOCK MINIMO");
                                btnAlarma.setName("ALERTASTOCKMINIMO");

                                jToolBar.add(btnAlarma);
                            }
                        }
                    }
                });
                timer1.setRepeats(true);
                timer1.start();
            }
            parametros = new HashMap();
            parametros.put("pDescripcion", "TIMER ALERTA INICIO TAREA TARDIO");
            parametros.put("pGrupoMail", "ALERTA INICIO TAREA TARDIO");
            parametros.put("pIdUsuario", DesktopApp.getApplication().getUsuarioLogueado().getIdUsuario());
            parametros.put("pJoinGruposMails", true);
            parametros.put("pJoinUsuarios", true);
            mails = (ArrayList<MailsT>) DesktopApp.getApplication().getMailsT(parametros);
            if (!mails.isEmpty()) {
                Float x = Float.parseFloat(DesktopApp.getApplication().getSetupT(parametros).get(0).getValor()) * 60000;
                delay = x.intValue();
//                delay = Integer.parseInt(DesktopApp.getApplication().getSetupT(parametros).get(0).getValor());
                timer2 = new Timer(delay, new ActionListener() {

                    public void actionPerformed(ActionEvent e) {

                        ActionMap actionMap = Application.getInstance(DesktopApp.class).getContext().getActionMap(DesktopView.class, DesktopApp.getApplication().getDesktopView());
                        ResourceMap resourceMap = Application.getInstance(DesktopApp.class).getContext().getResourceMap(DesktopView.class);
                        DateFormat fechaFormatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
                        HashMap parametros = new HashMap();
                        parametros.put("pJoinEstados", true);
                        parametros.put("pJoinMaquinas", true);
                        parametros.put("pIdEstado", 22);
                        parametros.put("pFechaInicioEstimadaLT", new Date());
                        StringBuffer detalle = new StringBuffer();
                        ArrayList<DetalleProduccionT> detalleProduccionList = (ArrayList<DetalleProduccionT>) DesktopApp.getApplication().getDetalleProduccionT(parametros);
                        if (!detalleProduccionList.isEmpty()) {
                            for (DetalleProduccionT detalleProduccionT : detalleProduccionList) {
                                detalle.append("\n" + detalleProduccionT.getIdMaquina().getDescripcion());
                            }

                            Boolean incluido = false;
                            for (int i = 0; i < jToolBar.getComponents().length; i++) {
                                Component component = jToolBar.getComponents()[i];
                                if (component.getName().equals("ALERTAINICIOTAREATARDIO")) {
                                    incluido = true;
                                }
                            }
                            if (!incluido) {
                                JButton btnAlarma = new JButton();
                                btnAlarma.setAction(actionMap.get("alertaInicioTareaTardio"));
                                btnAlarma.setIcon(resourceMap.getIcon("jButtonToolBar.icon")); // NOI18N
                                btnAlarma.setText("");
                                btnAlarma.putClientProperty("titulo", "Alerta Inicio Tarea Tardio");
                                btnAlarma.putClientProperty("cuerpo", "[" +
                                        fechaFormatter.format(new Date()) + "]" +
                                        "\nSe detectaron inicios tardios en las siguientes maquinas:" +
                                        detalle);
                                btnAlarma.setToolTipText("ALERTA INICIO TAREA TARDIO");
                                btnAlarma.setName("ALERTAINICIOTAREATARDIO");

                                jToolBar.add(btnAlarma);

                            }
                        }
                    }
                });
                timer2.setRepeats(true);
                timer2.start();
            }

            parametros = new HashMap();
            parametros.put("pDescripcion", "TIMER ALERTA FIN TAREA TARDIO");
            parametros.put("pGrupoMail", "ALERTA FIN TAREA TARDIO");
            parametros.put("pIdUsuario", DesktopApp.getApplication().getUsuarioLogueado().getIdUsuario());
            parametros.put("pJoinGruposMails", true);
            parametros.put("pJoinUsuarios", true);
            mails = (ArrayList<MailsT>) DesktopApp.getApplication().getMailsT(parametros);
            if (!mails.isEmpty()) {
                Float x = Float.parseFloat(DesktopApp.getApplication().getSetupT(parametros).get(0).getValor()) * 60000;
                delay = x.intValue();
//              delay = Integer.parseInt(DesktopApp.getApplication().getSetupT(parametros).get(0).getValor());
                timer3 = new Timer(delay, new ActionListener() {

                    public void actionPerformed(ActionEvent e) {

                        ActionMap actionMap = Application.getInstance(DesktopApp.class).getContext().getActionMap(DesktopView.class, DesktopApp.getApplication().getDesktopView());
                        ResourceMap resourceMap = Application.getInstance(DesktopApp.class).getContext().getResourceMap(DesktopView.class);
                        DateFormat fechaFormatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
                        HashMap parametros = new HashMap();
                        parametros.put("pJoinEstados", true);
                        parametros.put("pJoinMaquinas", true);
                        parametros.put("pIdEstado", 14);
                        parametros.put("pFechaFinEstimadaLT", new Date());
                        StringBuffer detalle = new StringBuffer();
                        ArrayList<DetalleProduccionT> detalleProduccionList = (ArrayList<DetalleProduccionT>) DesktopApp.getApplication().getDetalleProduccionT(parametros);
                        if (!detalleProduccionList.isEmpty()) {
                            for (DetalleProduccionT detalleProduccionT : detalleProduccionList) {
                                detalle.append("\n" + detalleProduccionT.getIdMaquina().getDescripcion());
                            }

                            Boolean incluido = false;
                            for (int i = 0; i < jToolBar.getComponents().length; i++) {
                                Component component = jToolBar.getComponents()[i];
                                if (component.getName().equals("ALERTAFINTAREATARDIO")) {
                                    incluido = true;
                                }
                            }
                            if (!incluido) {
                                JButton btnAlarma = new JButton();
                                btnAlarma.setAction(actionMap.get("alertaFinTareaTardio"));
                                btnAlarma.setIcon(resourceMap.getIcon("jButtonToolBar.icon")); // NOI18N
                                btnAlarma.setText("");
                                btnAlarma.putClientProperty("titulo", "Alerta Fin Tarea Tardio");
                                btnAlarma.putClientProperty("cuerpo", "[" +
                                        fechaFormatter.format(new Date()) + "]" +
                                        "\nSe detectaron fines tardios en las siguientes maquinas:" +
                                        detalle);
                                btnAlarma.setToolTipText("ALERTA FIN TAREA TARDIO");
                                btnAlarma.setName("ALERTAFINTAREATARDIO");

                                jToolBar.add(btnAlarma);

                            }
                        }
                    }
                });
                timer3.setRepeats(true);
                timer3.start();
            }
            parametros = new HashMap();
            parametros.put("pDescripcion", "TIMER ALERTA MANTENIMIENTO");
            parametros.put("pGrupoMail", "ALERTA MANTENIMIENTO");
            parametros.put("pIdUsuario", DesktopApp.getApplication().getUsuarioLogueado().getIdUsuario());
            parametros.put("pJoinGruposMails", true);
            parametros.put("pJoinUsuarios", true);
            mails = (ArrayList<MailsT>) DesktopApp.getApplication().getMailsT(parametros);
            if (!mails.isEmpty()) {
                Float x = Float.parseFloat(DesktopApp.getApplication().getSetupT(parametros).get(0).getValor()) * 60000;
                delay = x.intValue();
//              delay = Integer.parseInt(DesktopApp.getApplication().getSetupT(parametros).get(0).getValor());
                timer4 = new Timer(delay, new ActionListener() {

                    public void actionPerformed(ActionEvent e) {

                        ActionMap actionMap = Application.getInstance(DesktopApp.class).getContext().getActionMap(DesktopView.class, DesktopApp.getApplication().getDesktopView());
                        ResourceMap resourceMap = Application.getInstance(DesktopApp.class).getContext().getResourceMap(DesktopView.class);
                        DateFormat fechaFormatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
                        StringBuffer detalle = new StringBuffer();
                        HashMap parametros = new HashMap();
                        parametros.put("pMantenimiento", true);
                        ArrayList<MaquinasT> maquinasList = (ArrayList<MaquinasT>) DesktopApp.getApplication().getMaquinasT(parametros);
                        if (!maquinasList.isEmpty()) {
                            for (MaquinasT maquinaT : maquinasList) {
                                detalle.append("\n" + maquinaT.getDescripcion());
                            }

                            Boolean incluido = false;
                            for (int i = 0; i < jToolBar.getComponents().length; i++) {
                                Component component = jToolBar.getComponents()[i];
                                if (component.getName().equals("ALERTAMANTENIMIENTO")) {
                                    incluido = true;
                                }
                            }
                            if (!incluido) {
                                JButton btnAlarma = new JButton();
                                btnAlarma.setAction(actionMap.get("alertaMantenimiento"));
                                btnAlarma.setIcon(resourceMap.getIcon("jButtonToolBar.icon")); // NOI18N
                                btnAlarma.setText("");
                                btnAlarma.putClientProperty("titulo", "Alerta Mantenimiento");
                                btnAlarma.putClientProperty("cuerpo", "[" +
                                        fechaFormatter.format(new Date()) + "]" +
                                        "\nEs necesario mantenimiento en las siguientes maquinas:" +
                                        detalle);
                                btnAlarma.setToolTipText("ALERTA MANTENIMIENTO");
                                btnAlarma.setName("ALERTAMANTENIMIENTO");

                                jToolBar.add(btnAlarma);

                            }
                        }
                    }
                });
                timer4.setRepeats(true);
                timer4.start();
            }
        }
    }

    @Action
    public void alertaStockMinimo() {
        alerta("ALERTASTOCKMINIMO");
    }

    @Action
    public void alertaInicioTareaTardio() {
        alerta("ALERTAINICIOTAREATARDIO");
    }

    @Action
    public void alertaFinTareaTardio() {
        alerta("ALERTAFINTAREATARDIO");
    }

    @Action
    public void alertaMantenimiento() {
        alerta("ALERTAMANTENIMIENTO");
    }

    /**
     * Metodo que recorre todas las ventanas agregadas al desktopPane
     * y las va cerrando
     */
    @Action
    public void closeAllFrames() {
        JInternalFrame[] internalFrames = desktopPanel.getAllFrames();
        int i = internalFrames.length;
        while (0 < i) {
            i--;
            internalFrames[i].dispose();
        }
    }

    /**
     * Cambia el Look&Feel.
     * Rota entre el lookAndFeel NimROD y el lookAndFeel por defecto del sistema.
     */
    @Action
    public void changeLookFeel() {
        try {
            if (UIManager.getLookAndFeel().getName().equals("NimROD")) {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } else {
                UIManager.setLookAndFeel("com.nilo.plaf.nimrod.NimRODLookAndFeel");
            }
            SwingUtilities.updateComponentTreeUI(this.getFrame());
            this.getFrame().invalidate();
            this.getFrame().validate();
            this.getFrame().repaint();
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(DesktopView.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            Logger.getLogger(DesktopView.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(DesktopView.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedLookAndFeelException ex) {
            Logger.getLogger(DesktopView.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Muestra el frame de Acerca de...
     */
    @Action
    public void showAboutBox() {
        if (aboutBox == null) {
            JFrame mainFrame = DesktopApp.getApplication().getMainFrame();
            aboutBox = new DesktopAboutBox(mainFrame);
            aboutBox.setLocationRelativeTo(mainFrame);
        }
        DesktopApp.getApplication().show(aboutBox);
    }

    @Action
    public void showReporteUsuarios() {
        HashMap parametros = new HashMap();
        parametros.put("pduke", "C:\\Logos\\Duke.gif");
        parametros.put("pimagen", "C:\\Logos\\logoreporte.jpg");
//        ResourceMap resourceMap = getResourceMap();
//        parametros.put("pimagen", new ImageIcon(resourceMap.getImageIcon("pimagen").getImage()));
        JasperPrint jp = DesktopApp.getApplication().getReporte("usuarios", parametros);
        JasperViewer jv = new JasperViewer(jp, false);
        jv.setTitle("Reporte de Usuarios");
        jv.setVisible(true);
    }

    @Action
    public void showReporteNivelesTintas() {
        HashMap parametros = new HashMap();
        parametros.put("pduke", "C:\\Logos\\Duke.gif");
        parametros.put("pimagen", "C:\\Logos\\logoreporte.jpg");
        JasperPrint jp = DesktopApp.getApplication().getReporte("nivelestintas", parametros);
        JasperViewer jv = new JasperViewer(jp, false);
        jv.setTitle("Reporte de Niveles de Tintas");
        jv.setVisible(true);
    }

    @Action
    public Task showReporteProduccion() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.reportes.ReporteProduccion", "Carga de parametros para el reporte Produccion", padre);
    }

    @Action
    public Task showReporteStock() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.reportes.ReporteStock", "Carga de parametros para el reporte Stock", padre);
    }

    @Action
    public Task showRegistrarAjustes() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.depositos.RegistrarAjustesStock", "Registrar ajustes de stock", padre);
    }

    @Action
    public Task showReporteOrdenes() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.reportes.ReporteOrdenesCompra", "Carga de parametros para el reporte de Ordenes de Compra", padre);
    }

    @Action
    public Task showReporteCompras() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.reportes.ReportesRemitosIngreso", "Carga de parametros para el reporte de Compras", padre);
    }

    @Action
    public Task showReporteStockMinimo() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.reportes.ReporteStockMinimo", "Carga de parametros para el reporte Stock Minimo", padre);
    }

    @Action
    public Task showReporteDesviosInicio() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.reportes.ReporteDesvioIni", "Carga de parametros para el reporte de Desfasajes", padre);
    }

    @Action
    public Task showMantenimiento() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.produccion.ABMMantenimientos", "ABM Mantenimientos", padre);
    }

    @Action
    public Task showOrdenProduccion() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.produccion.RegistrarOrdenProduccion", "Ordenes de Produccion", padre);
    }

    @Action
    public Task showReporteDesvios() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.reportes.ReporteProduccionDesvio", "Carga de parametros para el reporte de Desvíos", padre);
    }

    @Action
    public Task showReporteMantenimientoMaquina() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.reportes.ReporteMantenimientoMaquina", "Carga de parametros para el reporte de Mantenimiento por Maquina", padre);
    }

    @Action
    public Task showReporteMantenimientoServicio() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.reportes.ReporteMantenimientoServicio", "Carga de parametros para el reporte de Mantenimiento por Servicio", padre);
    }

    @Action
    public Task showReporteMotivosDesvios() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.reportes.ReporteMotivosDesvios", "Carga de parametros para el reporte de Motivos de Desvíos", padre);
    }

    @Action
    public Task showReporteDesviosFin() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.reportes.ReporteDesvioFin", "Carga de parametros para el reporte de Desfasajes", padre);
    }

    @Action
    public Task showReporteMovStockCli() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.reportes.ReporteMovStockClientes", "Carga de parametros para el reporte de Movimientos de Stock por Clientes", padre);
    }

    @Action
    public Task showReporteMovStockProv() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.reportes.ReporteMovStockProveedores", "Carga de parametros para el reporte de Movimientos de Stock por Proveedores", padre);
    }

    @Action
    public Task showMaestroArticulos() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.produccion.MaestroArticulos", "Maestro articulo", padre);
    }

    @Action
    public Task showReporteClientes() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.reportes.ReporteClientes", "Carga de parametros para el reporte de Clientes", padre);
    }

    @Action
    public Task showReporteMovStock() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.reportes.ReporteMovimientosStock", "Carga de parametros para el reporte de Movimientos de Stock", padre);
    }

    @Action
    public Task showReporteRolxUsr() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.reportes.ReporteRolesXUsuarios", "Carga de parametros para el reporte Roles por Usuarios", padre);
    }

    @Action
    public Task showReporteProveedores() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.reportes.ReporteProveedores", "Carga de parametros para el reporte Proveedores", padre);
    }

    @Action
    public Task showReporteOrdenesDeposito() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.reportes.ReporteOrdenesDeposito", "Carga de parametros para el reporte Ordenes de Deposito", padre);
    }

    @Action
    public Task showReporteRemito() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.reportes.ReporteRemito", "Carga de parametros para el reporte Remito", padre);
    }

    @Action
    public Task showReporteFactura() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.reportes.ReporteFactura", "Carga de parametros para el reporte Factura", padre);
    }

    @Action
    public Task showControlarProduccion() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.produccion.ControlarProduccion", "Gestión de la Producción", padre);
    }

    @Action
    public Task showOrdenCompra() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.compras.RegistrarOrdenCompra", "Orden de compra", padre);
    }

    /**
     * Muestra el InternalFrame GestionUsuarios
     * @return Devuelve la tarea de mostrar el InternalFrame GestionUsuarios.
     * Corre en un hilo independiente.
     */
    @Action
    public Task showGestionUsuariosFrame() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.administracion.ABMUsuarios", "Gestion de usuarios", padre);
    }

    @Action
    public Task showRoles() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.administracion.ABMRoles", "Roles", padre);
    }

    @Action
    public Task showClientes() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.ventas.ABMClientes", "Clientes", padre);
    }

    @Action
    public Task showProveedores() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.compras.ABMProveedores", "Proveedores", padre);
    }

    @Action
    public Task showActividadesArticulo() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.produccion.ABMActividadesPorArticulo", "Actividades por articulo", padre);
    }

    @Action
    public Task showSetup() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.administracion.ABMSetup", "Setup", padre);
    }

    @Action
    public Task showRegistroRemitosFrame() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.ventas.RegistroRemitos", "Registro de Remitos", padre);
    }

    @Action
    public Task showRegistrarRemitos() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.ventas.RegistrarRemito", "Registro de Remitos", padre);
    }

    @Action
    public Task showRegistrarCompra() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.compras.RegistrarCompra", "Registro de Factura de Compra", padre);

    }

    @Action
    public Task showDomicilios() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.ventas.ABMDomicilios", "Domicilios", padre);

    }

    @Action
    public Task showArticulos() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.produccion.ABMArticulos", "Articulos", padre);
    }

    @Action
    public Task showTipificarDesvio() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.produccion.TipificarDesvio", "Desvios", padre);
    }

    @Action
    public Task showTiposIva() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.ventas.ABMTiposIva", "Tipos Iva", padre);
    }

    @Action
    public Task showEstados() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.administracion.ABMEstados", "Estados", padre);
    }

    @Action
    public Task showUnidadesMedida() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.depositos.ABMUnidadesMedida", "Unidades de Medida", padre);
    }

    @Action
    public Task showTiposDesvios() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.produccion.ABMTiposDesvios", "Tipos de Desvios", padre);
    }

    @Action
    public Task showTiposServicios() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.produccion.ABMTiposServicios", "Tipos de Servicios", padre);
    }

    @Action
    public Task showFeriados() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.administracion.ABMFeriados", "Feriados", padre);
    }

    @Action
    public Task showFacturador() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.ventas.Facturador", "Facturador", padre);
    }

    @Action
    public Task showSellos() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.produccion.ABMSellos", "Sellos", padre);
    }

    @Action
    public Task showMaquinas() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.produccion.ABMMaquinas", "Maquinas", padre);
    }

    @Action
    public Task showActividades() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.produccion.ABMActividades", "Actividades", padre);
    }

    @Action
    public Task showPrecios() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.ventas.ABMPrecios", "Precios", padre);
    }

    @Action
    public Task showListasPrecios() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.ventas.ABMListasPrecios", "Listas de Precios", padre);
    }

    @Action
    public Task showGruposMails() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.administracion.ABMGruposMails", "Grupos de Mails", padre);
    }

    @Action
    public Task showMails() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.administracion.ABMMails", "Mails", padre);
    }

    @Action
    public Task showCambiarPassword() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.administracion.CambiarPassword", "Cambiar contraseña", padre);
    }

    @Action
    public Task showComponentes() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.produccion.ABMComponentes", "Componentes", padre);
    }

    @Action
    public Task showOrganizarMenu() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.administracion.OrganizarMenu", "Organizar Menu", padre);
    }

    @Action
    public Task showABMClientes() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.ventas.ABMClientes", "ABM Clientes", padre);
    }

    @Action
    public Task showConsultaStock() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.depositos.ConsultaStock", "Consulta de Stock", padre);
    }

    @Action
    public Task showReporteGantt() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.reportes.ReporteGantt", "Reporte Gantt", padre);
    }

    @Action
    public Task showGanttComparativo() {
        return new ShowFrame(getApplication(), "ar.com.jpack.desktop.reportes.ReporteGanttReal", "Reporte Gantt", padre);
    }

    /**
     * InnerClass Task para mostrar los InternalFrame
     * @author jmhanun
     */
    class ShowFrame extends Task<String, Void> {

        String jInternalFrame;
        String mensaje;
        CustomInternalFrame padreFrame;

        /**
         * 
         * @param application DesktopApp.getApplication()
         * @param jInternalFrame String del internalFrame al que deseo invocar (canonicalname de la clase)
         * @param mensaje String del mensaje que deseo aparezca en el status bar una vez finalizada la tarea
         */
        public ShowFrame(Application application, String jInternalFrame, String mensaje, CustomInternalFrame padreFrame) {
            super(application);
            this.jInternalFrame = jInternalFrame;
            this.mensaje = mensaje;
            this.padreFrame = padreFrame;

        }

        @Override
        protected String doInBackground() throws Exception {
            statusMessageLabel.setText("Abriendo " + mensaje + "...");
            Class c = Class.forName(jInternalFrame);
            Constructor ctor = c.getConstructor();
            CustomInternalFrame f = (CustomInternalFrame) ctor.newInstance();
            CustomInternalFrame open = isOpen(f);
            if (open == null) {
                open = f;
                desktopPanel.add(open);
            }
            open.setTitle(mensaje);
            open.setPadre(padreFrame);
            SwingUtilities.updateComponentTreeUI(open);
            open.setVisible(true);
            desktopPanel.getDesktopManager().activateFrame(open);
            if (open.isIcon()) {
                open.setIcon(false);
            }
            if (!open.isSelected()) {
                open.setSelected(true);
            }


            return mensaje;
//            statusMessageLabel.setText("Abriendo " + mensaje + "...");
//            String[] partes = StringHelper.split(jInternalFrame, ".");
//            int indice = partes.length - 1;
//            Class c = Class.forName(jInternalFrame);
//            Method m = c.getMethod("get" + partes[indice]);
//            JInternalFrame f = (JInternalFrame) m.invoke(null);
//            if (!isOpen(f)) {
//                desktopPanel.add(f);
//            }
//            SwingUtilities.updateComponentTreeUI(f);
//            f.setVisible(true);
//            desktopPanel.getDesktopManager().activateFrame(f);
//            return mensaje;
        }

        @Override
        protected void succeeded(String result) {
            super.succeeded(result);
            setStatusMessage(result);
        }

        @Override
        protected void failed(Throwable cause) {
            super.failed(cause);
            JOptionPane.showInternalMessageDialog(desktopPanel, "Parece que no es posible ejecutar la tarea. Consulte con el administrador.");
        }
    }

    /**
     * Funcion recursiva para poblar el JMenu con los JMenu y los JMenuItems que dependen de el.
     * @param m JMenu que aun posee JMenu y/o JMenuItems que dependen de el.
     * @param rolPadreT Rol que define los datos del JMenu.
     * - para el caso de un JMenu define el nombre del componente.
     * - para el caso de un JMenuItem define la funcion que ejecutara.
     * @param resourceMap
     * @param actionMap
     * @return Devuelve el JMenu con todos los JMenu y JMenuItems que dependen de el.
     */
    private JMenu cargarMenu(JMenu m, RolesT rolPadreT, ResourceMap resourceMap, ActionMap actionMap) {
        for (Iterator<RolesT> it = rolesTs.iterator(); it.hasNext();) {
            RolesT rolesT = it.next();
            if (rolesT.getIdRolPadre() != null) {
                if (rolesT.getIdRolPadre().getIdRol() == rolPadreT.getIdRol()) {
                    if (rolesT.getFuncion() == null) {
                        JMenu menuHijo = new JMenu();
//                        menuHijo.setText(resourceMap.getString(rolesT.getComponente() + ".text")); // NOI18N
                        menuHijo.setText(rolesT.getRol()); // NOI18N
                        menuHijo.setToolTipText(rolesT.getDescripcion()); // NOI18N
                        menuHijo.setName(rolesT.getComponente()); // NOI18N
                        menuHijo = cargarMenu(menuHijo, rolesT, resourceMap, actionMap);
                        m.add(menuHijo);
                    } else {

                        JMenuItem item = new JMenuItem();
                        item.setAction(actionMap.get(rolesT.getFuncion())); // NOI18N
                        item.setText(rolesT.getRol());
                        item.setToolTipText(rolesT.getDescripcion());
                        item.setName(rolesT.getComponente()); // NOI18N
                        m.add(item);
                    }
                }
            }
        }
        return m;
    }

    public CustomInternalFrame getInternalFrame(String clase) {
        CustomInternalFrame frame = null;
        JInternalFrame[] list = DesktopApp.getApplication().getDesktopView().getDesktopPanel().getAllFrames();
        int i = 0;
        boolean open = false;
        while ((i < list.length) && (!open)) {
            if (list[i].getClass().getCanonicalName().equals(clase)) {
                open = true;
                frame = (CustomInternalFrame) list[i];
            }
        }
        return frame;
    }

    /**
     * Metodo para identificar si un JInternalFrame ya ha sido abierto en el desktopPanel.
     * @param f - InternalFrame que se desea abrir.
     * @return si el InternalFrame que se desea abrir ya se encuentra abierto.
     */
    private CustomInternalFrame isOpen(CustomInternalFrame f) {
        JInternalFrame[] list = desktopPanel.getAllFrames();
        int i = 0;
        CustomInternalFrame openFrame = null;
        boolean open = false;
        while ((i < list.length) && (!open)) {
            if (f.getClass().getCanonicalName().equals(list[i].getClass().getCanonicalName())) {
                open = true;
                openFrame = (CustomInternalFrame) list[i];
            }
            i++;
        }
        return openFrame;
    }

    public CustomInternalFrame getPadre() {
        return padre;
    }

    public void setPadre(CustomInternalFrame padre) {
        this.padre = padre;
    }
}